package root.message;

import root.user.User;
import exceptions.InvalidMessage;
import exceptions.InvalidReceiver;
import exceptions.InvalidSubject;

/**
 * Representa uma mensagem trocada entre usuarios.
 */
public class Message {

	private User sender, receiver;
	private String subject, message;
	private MessageType messageType;

	public Message(User sender, User receiver, String subject, String message,
			MessageType messageType) throws InvalidMessage, InvalidSubject,
			InvalidReceiver {

		setSender(sender);
		setReceiver(receiver);
		setSubject(subject);
		setMessage(message);
		this.messageType = messageType;
	}

	/**
	 * Retorna o tipo da mensagem
	 * 
	 * @return
	 */
	public MessageType getType() {
		return messageType;
	}

	/**
	 * Seta qual usuário mandou a mensagem
	 * 
	 * @param sender
	 */
	private void setSender(User sender) {
		this.sender = sender;
	}

	/**
	 * Seta qual usuário recebeu a mensagem
	 * 
	 * @param receiver
	 * @throws InvalidReceiver
	 */
	private void setReceiver(User receiver) throws InvalidReceiver {
		if (receiver != null)
			this.receiver = receiver;
		else
			throw new InvalidReceiver();
	}

	private void setSubject(String subject) throws InvalidSubject {
		if (validString(subject))
			this.subject = subject;
		else
			throw new InvalidSubject();
	}

	private void setMessage(String message) throws InvalidMessage {
		if (validString(message))
			this.message = message;
		else
			throw new InvalidMessage();
	}

	/**
	 * @return Usuario que mandou a mensagem
	 */
	public User getSender() {
		return sender;
	}

	/**
	 * 
	 * @return Usuário que recebeu a mensagem
	 */
	public User getReceiver() {
		return receiver;
	}

	/**
	 * @return assunto da mensagem
	 */
	public String getSubject() {
		return subject;
	}

	/**
	 * @return mensagem
	 */
	public String getMessage() {
		return message;
	}

	private boolean validString(String string) {
		return string != null && !string.isEmpty();
	}

}
